/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.uniceub.fsw.testes.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.testes.dao.AmbienteDAO;
import br.uniceub.fsw.testes.dao.CasoTesteDAO;
import br.uniceub.fsw.testes.dao.CicloTesteCasoTesteDAO;
import br.uniceub.fsw.testes.dao.CicloTesteDAO;
import br.uniceub.fsw.testes.dao.StatusCasoTesteDAO;
import br.uniceub.fsw.testes.dao.TipoTesteDAO;
import br.uniceub.fsw.testes.vo.AmbienteVO;
import br.uniceub.fsw.testes.vo.CasoTesteVO;
import br.uniceub.fsw.testes.vo.CicloTesteCasoTesteVO;
import br.uniceub.fsw.testes.vo.CicloTesteCasoTesteVO;
import br.uniceub.fsw.testes.vo.CicloTesteVO;
import br.uniceub.fsw.testes.vo.StatusCasoTesteVO;
import br.uniceub.fsw.testes.vo.TipoTesteVO;
import br.uniceub.fsw.util.Html;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.swing.JOptionPane;

/**
 *
 * @author Abrahao
 */
public class CasoTesteFacade {

    CasoTesteDAO casoDAO = new CasoTesteDAO();
    TipoTesteDAO tipoDAO = new TipoTesteDAO();
    AmbienteDAO ambienteDAO = new AmbienteDAO();
    StatusCasoTesteDAO statusDAO = new StatusCasoTesteDAO();
    CicloTesteCasoTesteDAO cicloCasoDAO = new CicloTesteCasoTesteDAO();
    CicloTesteDAO cicloDAO = new CicloTesteDAO();
    Html montarHtml = new Html();

    public String operacao(HttpServletRequest req) {

        String oper = req.getParameter("operacao");

        if (oper == null || oper.equals("")) {
            return "";
        }
        if (oper.equals("Consultar")) {
            return "Consultar";
        }
        if (oper.equals("Incluir")) {
            return "Inserir";
        }
        if (oper.equals("Alterar")) {
        }
        if (oper.equals("Excluir")) {
            excluirCaso(req);
            return "Excluir";
        }
        return "";
    }

    /**
     * Cria uma lista dos casos de teste vinculados à um ciclo de teste
     * @param req
     * @return
     */
    public String listarCasosTeste(HttpServletRequest req) {

        CasoTesteVO casoVO = new CasoTesteVO();
        List<CicloTesteCasoTesteVO> cicloCasoLista = new ArrayList();
        cicloCasoLista = cicloCasoDAO.consultarPorIdCiclo(Integer.parseInt(req.getParameter("idCicloTeste")));
        int idCiclo = Integer.parseInt(req.getParameter("idCicloTeste"));
        StringBuffer sb = new StringBuffer();
        TipoTesteVO tipoVO = new TipoTesteVO();
        StatusCasoTesteVO statusVO = new StatusCasoTesteVO();
        sb.append("<TABLE>");
        sb.append("<input name=idCicloTeste type='hidden' value='" + idCiclo + "'");
        sb.append("<tr>");
        sb.append("<td width='100%' align='center' valign='top' colspan=4>");
        sb.append("<BR>");
        sb.append("<B>Casos de Teste vinculados:</B>");
        sb.append("<BR>");
        sb.append("<BR>");
        sb.append("</td>");
        sb.append("</tr>");
        sb.append("<TR class='tituloTabela'>");
        sb.append("<TD>&nbsp;</TD>");
        sb.append("<TD> Nome </TD>");
        sb.append("<TD> Tipo </TD>");
        sb.append("<TD> Estado </TD>");
        sb.append("</TR>");
        for (int i = 0; i < cicloCasoLista.size(); i++) {
            casoVO = casoDAO.consultarPorId(cicloCasoLista.get(i).getCdCasoTeste());
            if (i % 2 == 0) {
                sb.append("<TR>\n");
            } else {
                sb.append("<TR class=\"impar\">\n");
            }

            if (casoVO != null) {
                sb.append("<TD>");
                sb.append("<input class='radio' type='radio' name='idCasoTeste' value='" + casoVO.getIdCasoTeste() + "'/></TD>");
                sb.append("<TD>" + casoVO.getNoCasoTeste() + "</TD>");
                tipoVO = tipoDAO.consultarPorId(casoVO.getCdTipoTeste());
                sb.append("<TD>" + tipoVO.getNoTipoTeste() + "</TD>");
                statusVO = statusDAO.consultarPorId(casoVO.getCdStatusCasoTeste());
                sb.append("<TD>" + statusVO.getNoStatusCasoTeste() + "</TD>");
            }
            sb.append("</TR>");
        }
        sb.append("</TABLE>");

        return sb.toString();


    }

    /**
     * Apresenta os detalhes de um caso de teste
     * @param req
     * @return
     */
    public String detalharCasoTeste(HttpServletRequest req) {

        CicloTesteCasoTesteVO cicloCasoVO = new CicloTesteCasoTesteVO();
        CicloTesteVO cicloVO = new CicloTesteVO();
        StringBuffer sb = new StringBuffer();
        int idOS = Integer.parseInt(req.getParameter("idOrdemServico"));
        int idCaso = Integer.parseInt(req.getParameter("idCasoTeste"));
        CasoTesteVO casoVO = new CasoTesteVO();
        casoVO = casoDAO.consultarPorId(idCaso);
        cicloCasoVO = cicloCasoDAO.consultarPorId(idCaso);
        cicloVO = cicloDAO.consultarPorId(cicloCasoVO.getCdCicloTeste());
        TipoTesteVO tipoVO = new TipoTesteVO();
        tipoVO = tipoDAO.consultarPorId(casoVO.getCdTipoTeste());
        StatusCasoTesteVO statusVO = new StatusCasoTesteVO();
        statusVO = statusDAO.consultarPorId(casoVO.getCdStatusCasoTeste());

        sb.append("<BR>");
        sb.append("<TABLE width='90%' border=0 cellpadding=2 cellspacing=2>\n");
        sb.append("<TR>\n");
        sb.append("<TD  width='25%' align='right' valign='top'><B>Número da OS:</B></TD>\n");
        sb.append("<TD width='25%' align='left' valign='top'>" + cicloVO.getCdOrdemServico() + "</TD>\n");
        sb.append("<TD width='25%' align='right' valign='top'>&nbsp;</TD>\n");
        sb.append("<TD width='25%' align='left' valign='top'>&nbsp;</TD>\n");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD width='25%' align='right' valign='top'><B>Ciclo de Teste:</B></TD>\n");
        sb.append("<TD width='25%' align='left' valign='top'>" + cicloCasoVO.getCdCicloTeste() + "</TD>\n");
        sb.append("<TD width='25%' align='right' valign='top'><B>Código do Caso:</B></TD>\n");
        sb.append("<TD width='25%' align='left' valign='top'>" + casoVO.getIdCasoTeste() + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD width='25%' align='right' valign='top'><B>Nome do Caso:</B></TD>\n");
        sb.append("<TD width='25%' align='left' valign='top'>" + casoVO.getNoCasoTeste() + "</TD>\n");
        sb.append("<TD width='25%' align='right' valign='top'><B>Tipo de Teste:</BR></TD>\n");
        sb.append("<TD width='25%' align='left' valign='top'>" + tipoVO.getNoTipoTeste() + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("<tr>");
        sb.append("<td width='100%' align='right' valign='middle' colspan=4>");
        sb.append("<BR>");
        sb.append("</td>");
        sb.append("</tr>");
        sb.append("<TR>\n");
        sb.append("<TD width='25%' align='right' valign='middle'><B>Estado do Caso de Teste:</B></TD>\n");
        sb.append("<TD width='75%' align='left' valign='top' colspan=3>" + statusVO.getNoStatusCasoTeste() + "</TD>\n");
        sb.append("<TD>&nbsp;</TD>\n");
        sb.append("<TD>&nbsp;</TD>\n");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD width='25%' align='right' valign='middle'><B>Descição:</B></TD>\n");
        sb.append("<TD width='75%' align='left' valign='top' colspan=3>" + casoVO.getDsCasoTeste() + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("</TABLE>\n");
        sb.append("<input name=idOrdemServico type='hidden' value='" + idOS + "'");


        return sb.toString();
    }

    /**
     * Exclui o caso de teste selecionado do banco de dados
     * @param req
     */
    public void excluirCaso(HttpServletRequest req) {
        CasoTesteVO casoVO = new CasoTesteVO();
        int id = Integer.parseInt(req.getParameter("idCasoTeste"));
        casoVO = casoDAO.consultarPorId(id);

        try {
            Transacao.iniciar();

            casoDAO.excluir(casoVO);

            Transacao.efetivar();
        } catch (Exception ex) {
            Transacao.desfazer();
        }

    }

    /**
     * Monta o código HTML da página de inclusão de um caso de teste
     * @return
     */
    public String montarIncluirCaso(HttpServletRequest req) {
        List<AmbienteVO> listaAmbienteVO = new ArrayList();
        List<TipoTesteVO> listaTipoVO = new ArrayList();
        AmbienteVO ambienteVO = new AmbienteVO();
        TipoTesteVO tipoVO = new TipoTesteVO();
        StringBuffer sb = new StringBuffer();
        listaAmbienteVO = ambienteDAO.consultarPorExemplo(ambienteVO);
        listaTipoVO = tipoDAO.consultarPorExemplo(tipoVO);
        sb.append("<TABLE>\n");
        sb.append("<input type='hidden' name'idCicloTeste' value='" + req.getParameter("idCicloTeste") + "' >");
        sb.append("<TR>\n");
        sb.append("<TD>Nome do Caso:</TD>\n");
        sb.append("<TD>" + montarHtml.criarInput("noCasoTeste", "") + "</TD>");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Descrição do Caso:</TD>\n");
        sb.append("<TD>" + montarHtml.criarInput("dsCasoTeste", "") + "</TD>");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Tipo de Teste:</TD>\n");
        sb.append("<TD>" + montarHtml.criarComboBox(listaTipoVO, "idTipoTeste", "noTipoTeste", 0) + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Ambiente:</TD>\n");
        sb.append("<TD>" + montarHtml.criarComboBox(listaAmbienteVO, "idAmbiente", "noAmbiente", 0) + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("</TABLE>\n");
        return sb.toString();

    }

    /**
     * Monta o código HTML da pagina de alteração de um caso de teste
     * @param req
     * @return
     */
    public String montarAlterarCaso(HttpServletRequest req) {
        List<AmbienteVO> listaAmbienteVO = new ArrayList();
        List<TipoTesteVO> listaTipoVO = new ArrayList();
        AmbienteVO ambienteVO = new AmbienteVO();
        TipoTesteVO tipoVO = new TipoTesteVO();
        CasoTesteVO casoVO = new CasoTesteVO();
        casoVO = casoDAO.consultarPorId(Integer.parseInt(req.getParameter("idCasoTeste")));
        StringBuffer sb = new StringBuffer();

        listaAmbienteVO = ambienteDAO.consultarPorExemplo(ambienteVO);
        listaTipoVO = tipoDAO.consultarPorExemplo(tipoVO);
        sb.append("<TABLE>\n");
        sb.append("<input type'hidden' name'idCicloTeste' value='" + req.getParameter("idCicloTeste") + "' >");
        sb.append("<input type'hidden' name'idCasoTeste' value='" + casoVO.getIdCasoTeste() + "' >");
        sb.append("<TR>\n");
        sb.append("<TD>Nome do Caso:</TD>\n");
        sb.append("<TD>" + montarHtml.criarInput("noCasoTeste", casoVO.getNoCasoTeste()) + "</TD>");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Descrição do Caso:</TD>\n");
        sb.append("<TD>" + montarHtml.criarInput("dsCasoTeste", casoVO.getDsCasoTeste()) + "</TD>");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Tipo de Teste:</TD>\n");
        sb.append("<TD>" + montarHtml.criarComboBox(listaTipoVO, "idTipoTeste", "noTipoTeste", casoVO.getCdTipoTeste()) + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Ambiente:</TD>\n");
        sb.append("<TD>" + montarHtml.criarComboBox(listaAmbienteVO, "idAmbiente", "noAmbiente", casoVO.getCdAmbiente()) + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("</TABLE>\n");
        return sb.toString();

    }

    /**
     * Inclui um caso de teste no banco de dados
     * @param req
     */
    public void incluirCaso(HttpServletRequest req) {
        JOptionPane.showMessageDialog(null, "To aki incluir");
        CasoTesteVO casoVO = new CasoTesteVO();
        CicloTesteVO cicloVO = new CicloTesteVO();
        cicloVO = cicloDAO.consultarPorId(Integer.parseInt(req.getParameter("idCicloTeste")));
        casoVO.setCdAmbiente(Integer.parseInt(req.getParameter("idAmbiente")));
        casoVO.setCdTipoTeste(Integer.parseInt(req.getParameter("idTipoTeste")));
        casoVO.setDsCasoTeste(req.getParameter("dsCasoTeste"));
        casoVO.setNoCasoTeste(req.getParameter("noCasoTeste"));
        casoVO.setCdStatusCasoTeste(statusDAO.consultarPorNome("Criado").getIdStatusCasoTeste());
        casoVO.setDtInicio(new Date(System.currentTimeMillis()));
        try {
            Transacao.iniciar();
            casoDAO.inserir(casoVO, cicloVO);
            Transacao.efetivar();
        } catch (Exception ex) {
            System.out.println(ex);
            Transacao.desfazer();
        }


    }

    /**
     * Altera um caso de teste no banco de dados
     * @param req
     */
    public void alterarCaso(HttpServletRequest req) {
        CasoTesteVO casoVO = new CasoTesteVO();
        casoVO = casoDAO.consultarPorId(Integer.parseInt(req.getParameter("idCasoTeste")));
        casoVO.setCdAmbiente(Integer.parseInt(req.getParameter("idAmbiente")));
        casoVO.setCdTipoTeste(Integer.parseInt(req.getParameter("idTipoTeste")));
        casoVO.setDsCasoTeste(req.getParameter("dsCasoTeste"));
        casoVO.setNoCasoTeste(req.getParameter("noCasoTeste"));
        try {
            Transacao.iniciar();
            casoDAO.alterar(casoVO);
            Transacao.efetivar();
        } catch (Exception ex) {
            System.out.println(ex);
            Transacao.desfazer();
        }

    }
}
